package os_1;

import java.util.*;

public class os_1_3 {

    // 定义进程类
    static class Process {
        int id; // 进程ID
        int arrivalTime; // 进程到达时间
        int burstTime; // 进程执行时间
        int remainingTime; // 进程剩余执行时间

        // 进程构造函数
        public Process(int id, int arrivalTime, int burstTime) {
            this.id = id;
            this.arrivalTime = arrivalTime;
            this.burstTime = burstTime;
            this.remainingTime = burstTime;
        }
    }

    // 定义多级反馈队列调度算法
    public static void multiLevelFeedbackQueueScheduling() {
        // 初始化五个级别的就绪队列
        Queue<Process>[] queues = new Queue[5];
        for (int i = 0; i < 5; i++) {
            queues[i] = new LinkedList<>();
        }

        // 生成10个进程
        Random random = new Random();
        List<Process> processes = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            int arrivalTime = random.nextInt(10); // 随机生成到达时间
            int burstTime = random.nextInt(10) + 1; // 随机生成执行时间
            processes.add(new Process(i + 1, arrivalTime, burstTime));
        }

        // 按到达时间排序
        processes.sort(Comparator.comparingInt(p -> p.arrivalTime));

        int currentTime = 0; // 当前时间
        while (true) {
            // 将到达的进程加入最高优先级队列
            for (Process p : processes) {
                if (p.arrivalTime == currentTime) {
                    queues[0].add(p);
                }
            }

            // 从最高优先级队列开始调度
            boolean allQueuesEmpty = true;
            for (int i = 0; i < 5; i++) {
                if (!queues[i].isEmpty()) {
                    allQueuesEmpty = false;
                    Process currentProcess = queues[i].poll(); // 从队列中取出进程
                    int timeSlice = 5 - i; // 时间片分别为5,4,3,2,1

                    // 执行进程
                    int executionTime = Math.min(timeSlice, currentProcess.remainingTime);
                    currentProcess.remainingTime -= executionTime;
                    currentTime += executionTime;

                    // 如果进程未完成，则降级到下一级队列
                    if (currentProcess.remainingTime > 0) {
                        if (i < 4) {
                            queues[i + 1].add(currentProcess);
                        } else {
                            queues[i].add(currentProcess);
                        }
                    }

                    // 显示当前队列状态
                    System.out.println("Time: " + currentTime);
                    for (int j = 0; j < 5; j++) {
                        System.out.print("Queue " + (j + 1) + ": ");
                        for (Process p : queues[j]) {
                            System.out.print("P" + p.id + "(" + p.remainingTime + ") ");
                        }
                        System.out.println();
                    }
                    System.out.println();

                    break;
                }
            }

            // 如果所有队列为空，则结束
            if (allQueuesEmpty) {
                break;
            }
        }
    }

    public static void main(String[] args) {
        multiLevelFeedbackQueueScheduling(); // 执行多级反馈队列调度算法
    }
}